/*
 * ComponenteDistribuidorExtra.java	
 *
 * Copyright 2008 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 07/10/08, 11:23:38 AM
 */
package com.ufps.cuatro.modelo.representacion.componente;

import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

import com.ufps.cuatro.modelo.biblioteca.TipoBiblioteca;
import com.ufps.cuatro.modelo.old.ComponenteBeans;
import com.ufps.cuatro.modelo.representacion.ModeloAsociado;
import com.ufps.cuatro.modelo.representacion.PlantillaCombo;
import com.ufps.cuatro.modelo.representacion.PlantillaComponente;
import com.ufps.cuatro.modelo.representacion.PropiedadBeans;
import com.ufps.cuatro.util.Utileria;
import com.ufps.cuatro.util.base.ComponenteBaseStandar;
import com.ufps.cuatro.util.generadores.codeobject.CodeContextLine;
import com.ufps.cuatro.util.generadores.codeobject.EnumTypeCodeSyntax;


/**
 * <i><b>ComponenteDistribuidorExtra:</b></i>Es una versión avanzada de la clase <code>Componente</code>
 * define propiedades y metodos necesarios para crear controles swing.
 * 
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 07/10/08 
 * @see ComponenteDistribuidor
 * @deprecated Se ha implementado un modelo de representación por tipos de datos.
 */
public class ComponenteDistribuidorExtra extends ComponenteDistribuidor{
    private static final long serialVersionUID = 8963896386639838415L;

    private int idClaseComponenteExtra;    
    /**
     * Serie Númerica para la generación de id de Objetos.
     */
    public static int serialIdComponenteExtra;
    /**
     * Contiene el <code>ComponenteGeneradoInterno</code> Principal que representará el
     * Control Swing que asu vez representa el Tipo de Dato del Modelo Analizado.
     */
    protected ComponenteGeneradoInterno objComponenteGenerador;
    /**
     * Esta Cadena contiene los ids de <code>ComponenteGeneradoSimple</code> incluidos en la creación
     * del Componente.
     */
    protected String strComponentesGenerados;              
    /**
     * Modelo Asociado que representará el <code>ComponenteDistribuidor</code>
     * en la Representación del Caso Colección.
     */
    protected ModeloAsociado objModeloAsociado;
    /**
     * Indica si el Componente Actual tiene un Modelo Asociado. Esto solo
     * aplica para el Caso Colección.
     * 
     */
    protected boolean intoCasoColeccion;
    
    
    /**
     * Constructor por Defecto
     * @param objComponenteBase      
     * @param heredado @DefinicionParametro
     * @param previsualizar   @DefinicionParametro
     */
    public ComponenteDistribuidorExtra(ComponenteBaseStandar objComponenteBase, boolean heredado, boolean previsualizar) {
        super(objComponenteBase, true, true);        
        this.heredado = heredado;
        this.previsualizar = previsualizar;                
        this.dni = Utileria.leerRecursoTexto("Utileria.dni.componente.distribuidor.extra");   
        if(!heredado) {
            this.idClaseComponenteExtra = (!previsualizar) ?
                    ComponenteDistribuidorExtra.serialIdComponenteExtra++ :
                    ComponenteDistribuidorExtra.serialIdComponenteExtra;
        }
    }   

    /**
     * Devuelve el id de creación del Componente. 
     * @return id de creación del Componente. 
     */
    public int getIdClaseComponenteExtra() {
       try{
            return idClaseComponenteExtra;
        }catch(java.lang.NullPointerException ex){}
       return 0;
    }    
    
    public void crearDistribuicionGrupalInicial(PlantillaCombo objPlantillaCombo, ArrayList<PlantillaComponente> objTempPlantillasComponentes){                
       try{
            ArrayList<Componente> objComponentesIncluidos = new ArrayList<Componente>();
            //Ubicar cada Plantilla con el Componente Asigando y Actualizar
            //Esta busqueda se hace por medio del id
            for(PlantillaComponente objTempPlantillaComponente : objTempPlantillasComponentes){
                if(!objTempPlantillaComponente.isGenerador()){
                    ComponenteGeneradoSimple objComponenteGenerado = this.objComponentesGenerados.get(objTempPlantillaComponente.getId());                
                    objComponenteGenerado.agregarDistribucionIndividual(objPlantillaCombo, objTempPlantillaComponente);
                    objComponentesIncluidos.add(objComponenteGenerado);
                }
                else{                
                    this.objComponenteGenerador.agregarDistribucionIndividual(objPlantillaCombo, objTempPlantillaComponente);
                    objComponentesIncluidos.add(this.objComponenteGenerador);
                }            
            }

            Distribuidor objDistribuidor = new Distribuidor(objComponentesIncluidos, objPlantillaCombo);
            this.agregarDistribucionGrupal(objPlantillaCombo, objDistribuidor);
        }catch(java.lang.NullPointerException ex){}
    }
      
    public ArrayList<PlantillaComponente> getDistribucionGrupalInicialHorizontal(PlantillaCombo objPlantillaCombo){
        if(objPlantillaCombo != null){
            int size = this.objComponentesGenerados.size();
            int filas = 0;
            int proxX = 0;            
            ArrayList<PlantillaComponente> objTempPlantillas = new ArrayList<PlantillaComponente>();
            for(int i = 0; i < size; i++){                
                Object obj = this.objComponentesGenerados.get(i);
                PlantillaComponente objPlantilla = new PlantillaComponente();
                objPlantilla.setRepresentacion(PlantillaComponente.GENERADO_DEPENDIENTE);
                if(obj instanceof ComponenteGeneradoSimple){
                    ComponenteGeneradoSimple objComponenteGenerado = (ComponenteGeneradoSimple) obj;                    
                    objPlantilla.setX(proxX);
                    objPlantilla.setY(filas);                    
                    objPlantilla.updateGridBadConstraintsFromComponente(objComponenteGenerado, objPlantillaCombo, true);
                    objPlantilla.setGenerador(false);
                    objPlantilla.setHeight(objComponenteGenerado.getObjGridBagConstraints().gridheight);
                    objPlantilla.setWidth(objComponenteGenerado.getObjGridBagConstraints().gridwidth);                    
                    objPlantilla.setIdComponente(objComponenteGenerado.getId());
                    objPlantilla.setId(i);
                    objPlantilla.setIdPlantilla(0);
                    objPlantilla.setIncluido(true);
                    objPlantilla.setZona(0);
                    this.objComponentesGenerados.set(i, objComponenteGenerado);
                }                
                proxX = objPlantilla.getObjGridBagConstraints().gridwidth;
                objTempPlantillas.add(objPlantilla);
            }
            //Se crea la Plantilla Componente para el Componente Parent
            PlantillaComponente objPlantilla = new PlantillaComponente();                            
            objPlantilla.setRepresentacion(PlantillaComponente.GENERADO_INDEPENDIENTE);
            objPlantilla.setX(proxX);
            objPlantilla.setY(filas);            
            objPlantilla.updateGridBadConstraintsFromComponente(objComponenteGenerador, objPlantillaCombo, true);
            objPlantilla.setGenerador(true);
            objPlantilla.setHeight(this.objComponenteGenerador.getObjGridBagConstraints().gridheight);
            objPlantilla.setWidth(this.objComponenteGenerador.getObjGridBagConstraints().gridwidth);                    
            objPlantilla.setIdComponente(this.objComponenteGenerador.getId());
            objPlantilla.setId(objTempPlantillas.size());
            objPlantilla.setIdPlantilla(0);
            objPlantilla.setIncluido(true);
            objPlantilla.setZona(0);
            objTempPlantillas.add(objPlantilla);
            return objTempPlantillas;
        }
        return null;
    }
        
    public ArrayList<PlantillaComponente> getDistribucionGrupalInicialVertical(PlantillaCombo objPlantillaCombo){
        if(objPlantillaCombo != null){
            int size = this.objComponentesGenerados.size();
            int columnas = 0;
            int proxX = 0;            
            ArrayList<PlantillaComponente> objTempPlantillas = new ArrayList<PlantillaComponente>();
            for(int i = 0; i < size; i++){                
                Object obj = this.objComponentesGenerados.get(i);
                PlantillaComponente objPlantilla = new PlantillaComponente();
                objPlantilla.setRepresentacion(PlantillaComponente.GENERADO_DEPENDIENTE);
                if(obj instanceof ComponenteGeneradoSimple){
                    ComponenteGeneradoSimple objComponenteGenerado = (ComponenteGeneradoSimple) obj;                    
                    objPlantilla.setX(columnas);
                    objPlantilla.setY(proxX);                    
                    objPlantilla.updateGridBadConstraintsFromComponente(objComponenteGenerado, objPlantillaCombo, true);
                    objPlantilla.setGenerador(false);
                    objPlantilla.setHeight(objComponenteGenerado.getObjGridBagConstraints().gridheight);
                    objPlantilla.setWidth(objComponenteGenerado.getObjGridBagConstraints().gridwidth);                    
                    objPlantilla.setIdComponente(objComponenteGenerado.getId());
                    objPlantilla.setId(i);
                    objPlantilla.setIdPlantilla(0);
                    objPlantilla.setIncluido(true);
                    objPlantilla.setZona(0);
                    this.objComponentesGenerados.set(i, objComponenteGenerado);                    
                }           
                proxX = objPlantilla.getObjGridBagConstraints().gridheight;
                objTempPlantillas.add(objPlantilla);
            }
            //Se crea la Plantilla Componente para el Componente Parent
            PlantillaComponente objPlantilla = new PlantillaComponente();                            
            objPlantilla.setRepresentacion(PlantillaComponente.GENERADO_INDEPENDIENTE);
            objPlantilla.setX(columnas);
            objPlantilla.setY(proxX);            
            objPlantilla.updateGridBadConstraintsFromComponente(objComponenteGenerador, objPlantillaCombo, true);
            objPlantilla.setGenerador(true);
            objPlantilla.setHeight(this.objComponenteGenerador.getObjGridBagConstraints().gridheight);
            objPlantilla.setWidth(this.objComponenteGenerador.getObjGridBagConstraints().gridwidth);                    
            objPlantilla.setIdComponente(this.objComponenteGenerador.getId());
            objPlantilla.setId(objTempPlantillas.size());
            objPlantilla.setIdPlantilla(0);
            objPlantilla.setIncluido(true);
            objPlantilla.setZona(0);
            objTempPlantillas.add(objPlantilla);
            return objTempPlantillas;
        }
        return null;
    }
        
    public ArrayList<PlantillaComponente> getDistribucionGrupalInicialRectangular(PlantillaCombo objPlantillaCombo){
        try{
            return null;
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorExtra.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
    
    /**
     * Deveuvle la Cadena que contiene los ids de <code>ComponenteGeneradoSimple</code> incluidos en la creación
     * del Componente.
     * @return Cadena que contiene los ids de <code>ComponenteGeneradoSimple</code> incluidos en la creación
     * del Componente.
     */
    public String getStrComponentesGenerados() {
        return strComponentesGenerados;
    }

    /**
     * Establece la Cadena que contiene los ids de <code>ComponenteGeneradoSimple</code> incluidos en la creación
     * del Componente.
     * @param strComponentesGenerados Cadena que contiene los ids de <code>ComponenteGeneradoSimple</code> incluidos en la creación
     * del Componente.
     */
    public void setStrComponentesGenerados(String strComponentesGenerados) {        
        this.strComponentesGenerados = strComponentesGenerados;
    }
    
    /**
     * Devuelve la Referencia que Contiene el <code>ComponenteGeneradoInterno</code> Principal que representará el
     * Control Swing que asu vez representa el Tipo de Dato del Modelo Analizado.
     * @return <code>ComponenteGeneradoInterno</code> Principal que representará el
     * Control Swing que asu vez representa el Tipo de Dato del Modelo Analizado.
     */
    public ComponenteGeneradoInterno getObjComponenteGenerador() {
        return objComponenteGenerador;
    }

    /**
     * Establece la Referencia que Contiene el <code>ComponenteGeneradoInterno</code> Principal que representará el
     * Control Swing que asu vez representa el Tipo de Dato del Modelo Analizado.
     * @param objComponenteGenerador Contiene el <code>ComponenteGeneradoInterno</code> Principal que representará el
     * Control Swing que asu vez representa el Tipo de Dato del Modelo Analizado.
     */
    public void setObjComponenteGenerador(ComponenteGeneradoInterno objComponenteGenerador) {
        this.objComponenteGenerador = objComponenteGenerador;
    }    
    
    public int sizeWidth(){        
       try{
            int size = 0;        
            for(ComponenteGeneradoSimple objComponente : this.objComponentesGenerados){
                size += objComponente.getObjPlantillaComponenteDistribucionIndividualSeleccionada().getObjGridBagConstraints().gridwidth;
            }
            return size + this.objComponenteGenerador.getObjPlantillaComponenteDistribucionIndividualSeleccionada().getObjGridBagConstraints().gridwidth;        
        }catch(java.lang.NullPointerException ex){}
       return 0;
    }

    public int sizeHeight(){        
      try{
        int size = 0;
        for(ComponenteGeneradoSimple objComponente : this.objComponentesGenerados){
            size += objComponente.getObjPlantillaComponenteDistribucionIndividualSeleccionada().getObjGridBagConstraints().gridheight;
        }
        return size + this.objComponenteGenerador.getObjPlantillaComponenteDistribucionIndividualSeleccionada().getObjGridBagConstraints().gridheight;        
    }catch(java.lang.NullPointerException ex){}
      return 0;
    }
    
    public boolean ubicarComponentesEnTablaDistribucion(){        
        try{
            Distribuidor objDistribuidorSeleccionado = this.getObjDistribuidorGrupalSeleccionado();
            return objDistribuidorSeleccionado.generarTablaDistribucion();
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;
    }
   
    public Componente buscarComponente(String strName){
        try{            
            strName = Utileria.formatStringSinHTML(strName);
            Componente objComponente;
            //Primero se Busca en la Colección de Componentes Incluidos
            objComponente = this.buscarComponenteEnDistribucion(strName);
            if(objComponente != null){
                return objComponente;
            }
            //Luego busco en los Componentes Generados
            objComponente = this.getObjComponenteIncluido(strName);
            if(objComponente != null){
                return objComponente;
            }
            if(this.objComponenteGenerador.getName().equals(strName)){
                return this.objComponenteGenerador;
            }
        }catch(java.lang.NullPointerException ex){            
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }  
    
    @Override
    public String toString() {
       try{
            if(this.eBiblioteca == TipoBiblioteca.eSwap){
                return this.objClassSwing.getSimpleName() + "BS" + dni + this.idClaseComponenteExtra;
            }
            else if(this.eBiblioteca == TipoBiblioteca.eLocal){
                return this.objClassSwing.getSimpleName() + "BL" + dni + this.idClaseComponenteExtra;
            }
            else if(this.eBiblioteca == TipoBiblioteca.eGlobal){
                return this.objClassSwing.getSimpleName() + "BG" + dni + this.idClaseComponenteExtra;
            }
            else if(this.getObjPropiedadesDisponibles() != null){            
                //se evalua si la propiedad name ha sido inicializada
                if(!this.getObjPropiedadesDisponibles().isEmpty()){                
                    return this.getName();
                }
            }
            return this.objClassSwing.getSimpleName() + this.dni + this.idClaseComponenteExtra;
        }catch(java.lang.NullPointerException ex){}
       return "";
    }
    
    @Override
    public int compareTo(Object o) {
      try{
        ComponenteDistribuidorExtra obj = (ComponenteDistribuidorExtra) o;
        if(this.idClaseComponenteExtra > obj.idClaseComponenteExtra)
            return 1;
        else if(this.idClaseComponenteExtra < obj.idClaseComponenteExtra)
            return -1;
        else
            return 0;
    }catch(java.lang.NullPointerException ex){}
      return 0;
    }  
    
    public boolean actualizarPlantillaComboDistribucionGrupalSeleccionada(PlantillaCombo objPlantillaComboDistribucionGrupalSeleccionada) {
      try{
            try{
                this.objPlantillaComboDistribucionGrupalSeleccionada = objPlantillaComboDistribucionGrupalSeleccionada;
                this.objComponenteGenerador.objPlantillaComboDistribucionIndividualSeleccionada = objPlantillaComboDistribucionGrupalSeleccionada;
                for(ComponenteGeneradoSimple objComponenteGenerado : this.objComponentesGenerados){
                    objComponenteGenerado.setObjPlantillaComboDistribucionIndividualSeleccionada(objPlantillaComboDistribucionGrupalSeleccionada);
                }            
                return true;
            }catch(java.lang.ArrayIndexOutOfBoundsException ex){
                Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);            
            }catch(java.lang.ArrayStoreException ex){
                Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);            
            }
        }catch(java.lang.NullPointerException ex){}
        return false;
    }        

    @Override
    public void ok() {
        if(this.previsualizar){
            this.idClaseComponenteExtra = ComponenteDistribuidorExtra.serialIdComponenteExtra++;
            this.previsualizar = false;
        }
    }
    
    @Override
    public boolean equals(Object obj) {
        if(obj instanceof ComponenteDistribuidorExtra){
            ComponenteDistribuidorExtra objComponente = (ComponenteDistribuidorExtra) obj;
            return this.toString().equals(objComponente.toString());
        }
        return super.equals(obj);
    }

    @Override
    public int hashCode() {
       try{
            int hash = 5;
            hash = 17 * hash + this.idClaseComponenteExtra;
            return hash;
         }catch(java.lang.NullPointerException ex){}
       return 0;
    }
    
    public void importId(int id){
        ComponenteDistribuidorExtra.serialIdComponenteExtra = ++id;
        this.idClaseComponenteExtra = ComponenteDistribuidorExtra.serialIdComponenteExtra++;
    }    
    

    @Override
    public Componente getObjComponenteIncluido(String strName) { 
        try{            
            for(ComponenteGeneradoSimple objComponenteGenerado : this.getObjComponentesGenerados()){
                String strPropertiesName = (String) objComponenteGenerado.getName();
                if(strName.equals(strPropertiesName)){
                    return objComponenteGenerado;                    
                }                
            }             
            String strPropertiesName = (String) this.objComponenteGenerador.getName();
            if(strName.equals(strPropertiesName)){
                return this;
            }            
        }catch(java.lang.NullPointerException ex){}
        return null;
    }
    
    /**
     * Devuelve el Estado que Indica si el Componente Actual tiene un Modelo Asociado. Esto solo
     * aplica para el Caso Colección.
     * @return Estado que Indica si el Componente Actual tiene un Modelo Asociado. Esto solo
     * aplica para el Caso Colección.
     */
    public boolean isIntoCasoColeccion() {
        return intoCasoColeccion;
    }
    
    /**
     * Devuelve el Modelo Asociado que representará el <code>ComponenteDistribuidor</code>
     * en la Representación del Caso Colección.
     * @return Modelo Asociado que representará el <code>ComponenteDistribuidor</code>
     * en la Representación del Caso Colección.
     */
    public ModeloAsociado getObjModeloAsociado() {
        return objModeloAsociado;
    }

    /**
     * Establece el Modelo Asociado que representará el <code>ComponenteDistribuidor</code>
     * en la Representación del Caso Colección.
     * @param objModeloAsociado Modelo Asociado que representará el <code>ComponenteDistribuidor</code>
     * en la Representación del Caso Colección.
     */
    public void setObjModeloAsociado(ModeloAsociado objModeloAsociado) {
        this.intoCasoColeccion = true;
        this.objModeloAsociado = objModeloAsociado;
    }

    public ComponenteBeans generarRepresentacionBeans() {
        ComponenteBeans objTempComponenteBeans = new ComponenteBeans(this);
        PropiedadBeans objPropiedadBeans = objComponenteGenerador.getObjPropiedadBeans();
        objTempComponenteBeans.add(objPropiedadBeans);        
        return objTempComponenteBeans;
    }

    @Override
    public ArrayList<CodeContextLine> generateSourceCodeSyntax(EnumTypeCodeSyntax eTypeCodeSintax) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public CodeContextLine generateSingleSourceCodeSyntax(EnumTypeCodeSyntax eTypeCodeSintax) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void generateSourceCodeSyntaxFaseFieldDefinitionInstance(ArrayList<CodeContextLine> objSourceLinesCode) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void generateSourceCodeSyntaxFaseFieldDefinitionClass(ArrayList<CodeContextLine> objSourceLinesCode) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void generateSourceCodeSyntaxFaseFieldDefinitionConstant(ArrayList<CodeContextLine> objSourceLinesCode) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void generateSourceCodeSyntaxFaseFieldInitializationInstance(ArrayList<CodeContextLine> objSourceLinesCode) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void generateSourceCodeSyntaxFaseFieldInitializationClass(ArrayList<CodeContextLine> objSourceLinesCode) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void generateSourceCodeSyntaxFaseFieldInitializationProperties(ArrayList<CodeContextLine> objSourceLinesCode) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void generateSourceCodeSyntaxFaseFieldInitializationGridBagConstraints(ArrayList<CodeContextLine> objSourceLinesCode) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void generateSourceCodeSyntaxFaseMethodDefinitionEvent(ArrayList<CodeContextLine> objSourceLinesCode) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void generateSourceCodeSyntaxFaseMethodImplementEvent(ArrayList<CodeContextLine> objSourceLinesCode) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void generateSourceCodeSyntaxFaseMethodImplementFunctionSet(ArrayList<CodeContextLine> objSourceLinesCode) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void generateSourceCodeSyntaxFaseMethodImplementFunctionGet(ArrayList<CodeContextLine> objSourceLinesCode) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    
    
}
    
    
